次のクエリからカウントを取得しようとすると問題が発生します。
var usersView = PopulateUsersView(); //usersView is an IQueryable object
var foo = usersView.Where(fields => fields.ConferenceRole.ToLower().Contains("role"));
ここで、UsersViewは、usersというEFエンティティから入力されるクラスです(上記のコードの最初の行を参照してください)。
これは、UsersViewクラスのクラス定義です。
public class UsersView
{
public int UserId { get; set; }
public string Title { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string Street1 { get; set; }
public string Street2 { get; set; }
public string City { get; set; }
public string PostCode { get; set; }
public string CountryName { get; set; }
public string WorkPlaceName { get; set; }
public string Gender { get; set; }
public string EMail { get; set; }
public string Company { get; set; }
public string RoleName { get; set; }
public string ConferenceRole { get; set; }
}
行を実行しようとすると、foo.Count()はNull例外を返します。これは、ConferenceRole列がデータベースでNullを許可していることが原因である可能性があります。
今私が理解できないのは、ObjectQueryで同じクエリを直接呼び出すと、レコードの数(つまり、foo2.Count()を呼び出す)が例外なく返されるということです。
var foo2 = entities.users.Where(fields => fields.ConferenceRole.ToLower().Contains("role"));
上記と同じクエリを実行できますが、代わりにIQueryable usersViewオブジェクトを使用できますか?
(entities.usersエンティティに直接クエリを実行するのではなく、usersViewオブジェクトを使用することが重要です)
編集
以下は、PopulateUsersViewメソッドのコードです
private IQueryable<UsersView> PopulateUsersView()
{
using (EBCPRegEntities entities = new EBCPRegEntities())
{
var users = entities.users.ToList();
List<UsersView> userViews = new List<UsersView>();
foreach (user u in users)
{
userViews.Add(new UsersView()
{
UserId = u.UserId,
Title = u.Title,
Name = u.Name,
Surname = u.Surname,
Street1 = u.Street1,
Street2 = u.Street2,
City = u.City,
PostCode = u.Post_Code,
CountryName = u.country.Name,
WorkPlaceName = u.workplace.Name,
Gender = u.Gender,
EMail = u.E_Mail,
Company = u.Company,
RoleName = u.roles.FirstOrDefault().Name,
ConferenceRole = u.ConferenceRole
});
}
return userViews.AsQueryable();
}
}
ありがとう
アップデート...
みんなありがとう、私はついにIQueryableオブジェクトとObjectQueryオブジェクトの違いに対する良い答えを見つけました。
解決策として、ConferenceRoleがnullであるかどうかを確認してから、多くの人が言っているように、containsメソッドで確認しています。