我正在使用CodeFirst EntityFramework.我有一个IQueryable<User>使用context.Users返回的实体; 其中context是EntityFramework的DbContext.从这个列表中我必须选择Id包含在Ids(long)数组中的那些.Id是用户实体的主键.我尝试了以下但得到编译器错误.
IQueryable<User> users = GetQueryableUsers();
long [] ids = GetSelectedIds(); //array of long representing Ids key of User entities
users.Intersect(ids); // compilation error
users.Where(user => ids.Contains(user.Id)); //compilation error
Run Code Online (Sandbox Code Playgroud)
编译错误是(没有找到Intersect/Contains的定义)注意:System.Linq已经导入.
我有一个ID数组,我想通过Linq查询传递给实体框架以返回任何匹配
我编写了Linq查询,可以将Ids转换为字符串并使用'Contains'运算符,例如:
模型
public class Order {
public long OrderId { get; set; }
public string Name { get; set; } ...}
Order[] orders = { new Order { OrderId = 123, Name = "Order1" }, new Order {...},...};
Run Code Online (Sandbox Code Playgroud)
我可以使用类似的东西:
long[] testArray = {123, 456};
Run Code Online (Sandbox Code Playgroud)
然后
var result = orders.Where(i => testArray.ToString().Contains(i.OrderId.ToString()));
Run Code Online (Sandbox Code Playgroud)
但我真的需要继续将Ids投射到弦上吗?如果我将它们保持为整数,我看起来好像无法访问'Contains'.
最终,我希望能够将此作为访问实体框架的查询的一部分,因此将查询作为IQueryable <>的一部分传递,以确保当我只需要一个handfull时,我不会返回大量的数据,例如如:
var orders = _repo.Orders().Where(i => orderArray.Contains(i.OrderId));
Run Code Online (Sandbox Code Playgroud)
所以任何解决方案如果通过EF查询params(int数组)而不是获取所有数据然后在内存中检查它将是有用的.
干杯!
任何想法在EF DbContext查询中可能出现什么问题?据我了解,这应该按照SO的同伴来进行。
我试过列表,空值检查,不是空值检查,但没有用。但是,如果我删除了null检查并仅保留,则查询确实起作用Contains()。但是,如果testID为null,则必须返回所有记录。
var testIDs = new int[] { 1, 3 };
var test = session.All<VendorBooking>(x => testIDs == null || testIDs.Contains(x.VendorServiceID)).ToList();
Run Code Online (Sandbox Code Playgroud)
(session.All只是利用context.Set<T>.Where())
引发异常:EntityFramework.SqlServer.dll中的“ System.NotSupportedException”
附加信息:无法比较'System.Int32 []'类型的元素。仅支持原始类型,枚举类型和实体类型。
非常感谢