2015-01-03 5 views
0

Я просто изучаю LINQ, и я столкнулся с проблемой и не знаю, как это сделать в LINQ.Запрос LINQ с условием where, содержащим

string numbers = "1,3,4,5"; 
string[] outletsInaStringArray = outlets.Split(','); 
List<string> numbersAsAList = outletsInaStringArray.ToList(); 

У меня в моей базе данных содержится пробег. Я хочу только выбрать строки WHERE, номер в базе данных находится в списке строк чисел «1,3,4,5» (эти цифры - всего лишь примеры).

Заранее спасибо


Я посмотрел на Тима и Джеймс ответы, а также посмотрел на линии, что Джеймс послал. Я все еще немного смущен ..... Извините. Ниже мой фактический код. Она компилирует, но не работает

string outlets = "1,3,4,5" 
string[] outletsNeeded = outlets.Split(','); 
List<string> outletsNeededList = outletsNeeded.ToList(); 

DashboardEntities1 db = new DashboardEntities1(); 
var deptSalesQuery = (
from d in db.DashboardFigures 
where (d.TypeOfinformation == "DEPTSALES") && (outletsNeeded.ToString().Contains(d.OutletNo.ToString())) 
            select new DeptSales 
            { 
              Dn = (int)d.Number, 
              Dnm = "Mens", 
              On = d.OutletNo, 
              Qs = (double)d.Value_4, 
              Se = (double)d.Value_2, 
              Si = (double)d.Value_3 
            }          
           ); 

В таблице DASHBAORDFIGURES в SQL у меня есть 2 записей, где выходы число = 1, и, следовательно, должны были прийти с двумя записями. Извините, если это простая вещь, ее просто новая для меня и ее разочарование.

+0

'ToString()' не поддерживается 'Linq-To-Entities'. Скорее преобразуйте список строк в список целых чисел и используйте 'Contains'. –

ответ

1

Вы можете использовать Contains как помеченные:

var query = db.Table 
    .Where(x => outletsInaStringArray.Contains(x.Number) && x.information == "SALES"); 

был синтаксис метода, если вы предпочитаете синтаксис запроса:

var query = from figure in db.Figures 
      where outletsInaStringArray.Contains(figure.number) 
       && figure.information == "SALES" 
      select figure; 

Но колонна number является int, то List<string> хранит строку , возможно, ваш поставщик LINQ не поддерживает .Contains(figure.ToString()). Затем сначала преобразуйте строки в int:

List<int> outletsNeededList = outletsNeeded.Select(int.Parse).ToList(); 
+0

Привет, Тим, спасибо за это, как бы я использовал это в инструкции LINQ ниже. – Alpesh

+0

var salesQuery = (from d in db.Figures где (d.information == "SALES") && (WHERE d.number находится в списке "1,3,4,5") select {....} – Alpesh

+0

@TimSchmelter: Вероятно, наложение на дополнительное ограничение на linq также. –

0

Ответ, предоставленный Тимом, является одним из способов. Linq и лямбда взаимозаменяемы. Посмотрите также на следующую публикацию. Link

var result = from x in db.Table.ToList() 
      where outletsInaStringArray.Contains(x.Number) 
      select x; 

имеют Также смотрите следующие, как он предлагает очень похожее решение на тот, который вы ищете: Link

0

По я понимаю, вы хотите получить данные по таким же образом, как IN (SQL) это делает.

SELECT <Field_List> 
FROM Table 
WHERE IntegerField IN (1,2,4,5) 

Но мне интересно, почему вы хотите сделать это таким образом, когда вы можете присоединиться к данным и получить только совпадения. Хуже то, что вы пытаетесь смешать различные типы данных и передать запятую текст с разделителями в виде набора целых чисел (я могу ошибаться):

SELECT <Field_List> 
FROM Table 
WHERE IntegerField IN ("1,2,4,5") 

Выше запрос не будет выполнять, так как множество целых чисел «упакован» в строку с разделителями-запятыми. Чтобы выполнить этот запрос, необходимо выполнить преобразование между типами данных. Числа в строке должны быть преобразованы в набор целых чисел (с помощью пользовательского определения разделения функций или Common Table Expression):

;WITH CTE AS 
(
    --here convertion occurs 
) 
SELECT t2.<Field_List> 
FROM CTE As t1 INNER JOIN TableName AS t2 ON t1.MyNumber = t2.IntegerField 

Linq + любой язык программирования является более гибким. Вы можете построить список целых чисел (Список) для построения запроса.

См простого примера:

void Main() 
{ 

    List<MyData> data = new List<MyData>{ 
        new MyData(1,10), 
        new MyData(2, 11), 
        new MyData(5, 12), 
        new MyData(8, 13), 
        new MyData(12, 14) 
        }; 

    //you're using comma delimited string 
    //string searchedNumbers = "1,3,4,5"; 
    //var qry = from n in data 
    //  join s in searchedNumbers.Split(',').Select(x=>int.Parse(x)) on n.ID equals s 
    //  select n; 
    //qry.Dump(); 

    List<int> searchedNumbers = new List<int>{1,2,4,5}; 
    var qry = from n in data 
      join s in searchedNumbers on n.ID equals s 
      select n; 
    qry.Dump(); 

} 

// Define other methods and classes here 
class MyData 
{ 
    private int id = 0; 
    private int weight = 0; 

    public MyData(int _id, int _weight) 
    { 
     id = _id; 
     weight = _weight; 
    } 

    public int ID 
    { 
     get{return id;} 
     set {id = value;} 
    } 

    public int Weight 
    { 
     get{return weight;} 
     set {weight = value;} 
    } 
} 

Результат:

ID Weight 
1 10 
5 12 

Приветствие
Maciej

0

Спасибо всем IV теперь получил его на работу, используя все ваши предложения

заключительный код, который работает, выглядит следующим образом:

DeptSales myDeptSales = new DeptSales();     // Single department 
List<DeptSales> myDeptSalesList = new List<DeptSales>(); // List of Departments 
DashboardEntities1 db = new DashboardEntities1(); 

var deptSalesQuery = from d in db.DashboardFigures 
join s in outlets.Split(',').Select(x => int.Parse(x)) on d.OutletNo equals s 
where (d.TypeOfinformation == "DEPTSALES") 
select new DeptSales 
        { 
        Dn = (int)d.Number, 
        Dnm = "Mens", 
        On = d.OutletNo, 
        Qs = (double)d.Value_4, 
        Se = (double)d.Value_2, 
        Si = (double)d.Value_3 
        }; 

Еще раз спасибо.

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