Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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查询中完成此查询吗?_C#_Linq_Linq To Sql - Fatal编程技术网

C# 我可以在单个LINQ查询中完成此查询吗?

C# 我可以在单个LINQ查询中完成此查询吗?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我正试图解决一个复杂的问题,但我在SQL和LINQ方面的技能充其量是中等的,我不知道如何做到这一点。我可以使用多个查询,但我想知道是否可以使用一个查询 我有一个SQL中的定价表。我关心的三个字段是SearchCodeGUID,LocationGUID,和ClientGUID。位置和客户端都可以为空 执行查询时,我有一个SearchGUID、一个StateGUID、一个CountyGUID和一个ClientGUID。下面是我想要执行的查询。对于所有这些,我想要的是SearchGUID=Search

我正试图解决一个复杂的问题,但我在SQL和LINQ方面的技能充其量是中等的,我不知道如何做到这一点。我可以使用多个查询,但我想知道是否可以使用一个查询

我有一个SQL中的
定价
表。我关心的三个字段是
SearchCodeGUID
LocationGUID
,和
ClientGUID
。位置和客户端都可以为空

执行查询时,我有一个SearchGUID、一个StateGUID、一个CountyGUID和一个ClientGUID。下面是我想要执行的查询。对于所有这些,我想要的是
SearchGUID=SearchGUID
。操作顺序如下所示:

首先,我想检查一个客户是否有该县的价格-其中
ClientGUID=ClientGUID
LocationGUID=CountyGUID

如果那不存在,我想看看是否只有该县的记录-where
LocationGUID=CountyGUID

如果不存在,我想看看该状态是否有记录,其中
LocationGUID=StateGUID


最后,如果不存在,我只希望记录
LocationGUID
ClientGUID
为空,并且
SearchGUID
匹配。

一种方法是使用OrderBy:

IQueryable<Pricing> table = ...
var matches = table.Where(p => p.SearchGUID = searchGUID);
var result = matches.Select(p => new
{
    pricing = p 
    // 0 score if client & county match 
    score = p.ClientGUID == clientGUID && p.LocationGUID == countyGUID 
        ? 0
        // 1 score if just county match
        : p.LocationGUID == countyGUID
            ? 1
            // 2 score if just state match
            : p.LocationGUID == stateGUID
                ? 2
                // 3 score if client & location are null
                : p.ClientGUID == null && p.LocationGUID == null
                    ? 3
                    // 4 score if it missed all conditions
                    : 4
 })
 .Where(t => t.score < 4) // eliminate mismatches
 .OrderBy(t => t.score) // put low scores first
 .Select(t => t.pricing) // if we want to read just the pricing entity, select it
 .FirstOrDefault(); // take the first match, or null if no match was found
IQueryable表=。。。
var matches=table.Where(p=>p.SearchGUID=SearchGUID);
var result=匹配项。选择(p=>new
{
定价=p
//如果客户和县匹配,则得分为0
score=p.ClientGUID==ClientGUID&&p.LocationGUID==countyGUID
? 0
//只要郡队比赛就得1分
:p.LocationGUID==countyGUID
1.
//2分,如果只是状态匹配
:p.LocationGUID==stateGUID
2.
//如果客户和地点为空,则得3分
:p.ClientGUID==null&&p.LocationGUID==null
3.
//4分,如果它错过了所有条件
: 4
})
.Where(t=>t.score<4)//消除不匹配
.OrderBy(t=>t.score)//将低分放在第一位
.Select(t=>t.pricing)//如果我们只想读取定价实体,请选择它
.FirstOrDefault();//获取第一个匹配项,如果未找到匹配项,则为null

我喜欢蔡斯的答案,但我想我应该发布一个更传统的答案。如果在大量数据上有一个惰性列表,这可能会更快。。。但我没有声明,因为我对您的实际数据模型一无所知

  var idMatch = Pricing.Select(p => p.SearchCodeGUID == SearchGUID);

  var countyMatch = idMatch.Select(p => p.LocationGUID == CountyGUID);

  if (countryMatch.Any()) // match one of two first cases
  {
     var clientToo = countyMatch.Select(p => p.ClientGUID == ClientGUID)
                       .FristOrDefault();

     if (clientToo != null)
       return(clientToo);
     else
       return(countyMatch.First());
  }

  var stateMatch = idMatch.Select(p => p.LocationGUID == stateGUID)
                     .FirstOrDefault();

  if (stateMatch != null) 
    return(stateMatch);

  return(idMatch.Select(p => (LocationGUID == null) && (ClientGUID == null))
           .FirstOrDefault());

您当前的代码是什么?@newStackExchangeInstance我没有任何当前代码,我甚至无法想象如何以一种不太混乱的方式管理它。目前,我使用单独的queries@cost-发布您当前的单独查询-有人可能会发现一种方法,可以将他们结合起来,用一双全新的眼睛看着他们。哦,这是一个有趣的想法,让我试试这个。我还想知道这与单独的查询之间的速度差异是什么is@cost:这是你必须描述的。在许多情况下,往返时间比查询时间长,所以只运行一个查询更好。另一方面,使用多查询系统,如果第一个条件匹配,您可以只运行一个简单的查询,如果这种情况经常发生,可能会更好。另一个有趣的解决方案。我想我要和你的答案和蔡斯的答案玩一玩,看看它们是怎么回事