Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq Union:如何向查询添加文本值?_C#_Linq_Union - Fatal编程技术网

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();