2013-07-06 2 views
0

У меня сложная ситуация, которую я пытаюсь решить, но мои навыки с SQL и LINQ в лучшем случае умеренные, и я не вижу, как это сделать. Я могу сделать это с несколькими запросами, но я хотел бы знать, могу ли я сделать это с одним.Можно ли выполнить этот запрос в одном запросе LINQ?

У меня есть таблица Pricing в SQL. Три поля, которые мне волнуют, - это SearchCodeGUID, LocationGUID и ClientGUID. Расположение и клиент имеют значение null.

При выполнении моего запроса у меня есть SearchGUID, StateGUID, CountyGUID и ClientGUID. Ниже приведены запросы, которые я хочу выполнить. Для всех этих я хочу, где SearchGUID = SearchGUID. Порядок операций работает, как например:

Прежде всего я хочу, чтобы проверить, если клиент имеет цену округа - Где ClientGUID = ClientGUID и LocationGUID = CountyGUID

Если не существует, я хочу, чтобы проверить, есть ли запись только для этого округа - где LocationGUID = CountyGUID

Если не существует, я хочу, чтобы проверить, есть ли запись для этого состояния - где LocationGUID = StateGUID

Наконец, если это не существует, я просто хочу запись где LocationGUID и ClientGUID являются нулевыми и соответствуют SearchGUID.

+0

Каков ваш текущий код? –

+0

@newStackExchangeInstance У меня нет никакого текущего кода, я даже не могу даже подумать, как бы я справился с этим так, чтобы это было не очень грязно. В настоящее время я делаю это с отдельными запросами – cost

+2

@cost - размещайте свои текущие отдельные запросы - кто-то может увидеть способ объединить их, глядя на них со свежим набором глаз. – Tim

ответ

1

Один из способов сделать это с 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 
+0

О, это интересная идея, позвольте мне попробовать. Я также задаюсь вопросом, какова разница в скорости между этим и отдельными запросами: – cost

+0

@cost: это то, что вам нужно профилировать. Во многих случаях время в оба конца больше времени запроса, поэтому лучше всего работать с одним запросом. С другой стороны, при использовании системы с несколькими запросами вы можете запускать только один простой запрос, если первое условие соответствует, что может быть лучше, если это произойдет очень часто. – ChaseMedallion

1

Мне нравится ответ Чейза, но я решил опубликовать более традиционный. Учитывая ленивый список по большому количеству данных, это, вероятно, быстрее ... но я не предъявляю никаких претензий, так как я действительно не имею в виду вашу фактическую модель данных.

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

Еще одно интересное решение. Я думаю, что буду играть с твоими и ответами Чейза и посмотреть, как каждый из них работает – cost

Смежные вопросы