C# Linq Union:如何向查询添加文本值?
我需要向查询中添加一个文本值。我的尝试C# Linq Union:如何向查询添加文本值?,c#,linq,union,C#,Linq,Union,我需要向查询中添加一个文本值。我的尝试 var aa = new List<long>(); aa.Add(0); var a = Products.Select(p => p.sku).Distinct().Union(aa); a.ToList().Dump(); // LinqPad's way of showing the values 例如,如果我使用实体框架4,我可以在Union语句中添加什么来始终包含“种子”ID? 我正在尝试生成如下所示的SQL代码: sel
var aa = new List<long>();
aa.Add(0);
var a = Products.Select(p => p.sku).Distinct().Union(aa);
a.ToList().Dump(); // LinqPad's way of showing the values
例如,如果我使用实体框架4,我可以在Union语句中添加什么来始终包含“种子”ID?
我正在尝试生成如下所示的SQL代码:
select distinct ID
from product
union
select 0 as ID
因此,稍后我可以将列表加入到自身中,这样我就可以找到下一个最高值不存在的所有值(找到集合中最低的可用ID)
编辑:原始Linq查询以查找最低可用ID
var skuQuery = Context.Products
.Where(p => p.sku > skuSeedStart &&
p.sku < skuSeedEnd)
.Select(p => p.sku).Distinct();
var lowestSkuAvailableList =
(from p1 in skuQuery
from p2 in skuQuery.Where(a => a == p1 + 1).DefaultIfEmpty()
where p2 == 0 // zero is default for long where it would be null
select p1).ToList();
var Answer = (lowestSkuAvailableList.Count == 0
? skuSeedStart :
lowestSkuAvailableList.Min()) + 1;
var skukery=Context.Products
.其中(p=>p.sku>skuSeedStart&&
p、 skup.sku).Distinct();
var LowestSkueAvailableList=
(来自SKU查询中的p1)
从skuQuery.Where(a=>a==p1+1.DefaultIfEmpty()中的p2开始
其中p2==0//0是默认值,在长时间内为null
选择p1).ToList();
var-Answer=(最低的skuavaailablelist.Count==0
?开始:
最小值())+1;
此代码创建两个SKU集,偏移1,然后选择下一个最高SKU不存在的SKU。然后,它选择其中的最小值(最低SKU,下一个最高SKU可用)
要使其工作,种子必须位于连接在一起的集合中。您的问题是,您的查询正在完全转变为LINQ到SQL查询,而您需要的是一个LINQ到SQL查询,并在其上进行本地操作
解决方案是在处理查询后告诉编译器您想要使用LINQ to对象(换句话说,将扩展方法解析更改为查看IEnumerable
,而不是IQueryable
)。最简单的方法是将AsEnumerable()
钉在查询的末尾,如下所示:
var aa = new List<long>();
aa.Add(0);
var a = Products.Select(p => p.sku).Distinct().AsEnumerable().Union(aa);
a.ToList().Dump(); // LinqPad's way of showing the values
var aa=新列表();
aa.加入(0);
VarA=Products.Select(p=>p.sku).Distinct().AsEnumerable().Union(aa);
a、 ToList().Dump();//LinqPad显示值的方式
预先:不是准确回答你提出的问题,而是以不同的方式解决你的问题
这个怎么样:
var a = Products.Select(p => p.sku).Distinct().ToList();
a.Add(0);
a.Dump(); // LinqPad's way of showing the values
您应该创建用于存储常量值的数据库表,并将此表中的查询传递给Union运算符
例如,让我们想象一下表“Defaults”,字段“Name”和“Value”仅包含一条记录(“SKU”,0)
然后你可以像这样重写你的表达式:
var zero = context.Defaults.Where(_=>_.Name == "SKU").Select(_=>_.Value);
var result = context.Products.Select(p => p.sku).Distinct().Union(zero).ToList();
代码最终获得的最低可用ID不少于“seed”。当前,它从某个现有ID开始获取最低ID。因此,为什么“0”需要成为查询的一部分。在SQL中,我确实从Product union中选择不同的ID选择0作为ID
(我添加了distinct以澄清它选择不同的值)@Zim博士:我认为不可能在LINQ to SQL查询中引入这样的实际文字值。如果您可以在更大的上下文中发布查询,我们可能会找到另一种方法来剥猫皮,但一般来说,这是不可能的。添加了原始Linq查询:)我添加了原始Linq查询,这将更好地解释为什么我无法在本地提取整组SKU。
var zero = context.Defaults.Where(_=>_.Name == "SKU").Select(_=>_.Value);
var result = context.Products.Select(p => p.sku).Distinct().Union(zero).ToList();