SORU
6 Ocak 2009, Salı


nasıl SERİ içinde sorgu yapmak

İşte ETMENİZ dönüştürmek için çalışıyorum bu sorgu örneği:

SELECT *
FROM Users
WHERE Users.lastname LIKE '%fra%'
    AND Users.Id IN (
         SELECT UserId 
         FROM CompanyRolesToUsers 
         WHERE CompanyRoleId in (2,3,4) )

CompanyRolesToUsers Users, FK arasında bir ilişki vardır ama pek çok ilişki ve CompanyRolesToUsers birleşim tablosu.

Biz zaten sitemizin en inşa etmişlerdir, ve biz zaten filtreleme çoğu bina İfadeleri tarafından PredicateExtensions bir sınıf kullanarak çalışıyor.

Basit filtreler için kod şöyle görünür:

 if (!string.IsNullOrEmpty(TextBoxLastName.Text))
 {
     predicateAnd = predicateAnd.And(c => c.LastName.Contains(
                                     TextBoxLastName.Text.Trim()));
 }

e.Result = context.Users.Where(predicateAnd);

Başka bir tabloda bir alt seçim için bir koşul eklemek için çalışıyorum. (CompanyRolesToUsers)

Eklemek istediğim şey bu olan bir şey

int[] selectedRoles = GetSelectedRoles();
if( selectedRoles.Length > 0 )
{
    //somehow only select the userid from here ???:
    var subquery = from u in CompanyRolesToUsers
                   where u.RoleID in selectedRoles
                   select u.UserId;

    //somehow transform this into an Expression ???:
    var subExpression = Expression.Invoke(subquery);

    //and add it on to the existing expressions ???:
    predicateAnd = predicateAnd.And(subExpression);
}

Bunu yapmak için herhangi bir yolu var mı? Saklı yordam kolayca yazabilirim çünkü sinir bozucu, ama bu SERİ olayında daha yeniyim ve yetiştirmem gereken işler var. Yukarı uyan bir örnek bulmak mümkün olmamıştır, ama orada bir yerlerde olduğuna eminim.

TİA,< / ^ br . Marcel

CEVAP
7 Ocak 2009, ÇARŞAMBA


Burada senin için bir sorgu!

List<int> IdsToFind = new List<int>() {2, 3, 4};

db.Users
.Where(u => SqlMethods.Like(u.LastName, "%fra%"))
.Where(u =>
    db.CompanyRolesToUsers
    .Where(crtu => IdsToFind.Contains(crtu.CompanyRoleId))
    .Select(crtu =>  crtu.UserId)
    .Contains(u.Id)
)

< / ^ hr .

Sorunun bu kısmı ile ilgili:

predicateAnd = predicateAnd.And(c => c.LastName.Contains(
                                TextBoxLastName.Text.Trim()));

Ben şiddetle sorgu yazma önce metin dize ayıklamak öneririz.

string searchString = TextBoxLastName.Text.Trim();
predicateAnd = predicateAnd.And(c => c.LastName.Contains( searchString));

Veritabanına gönderilen alır ne üzerinde daha iyi kontrol sağlamak. Orijinal kodu, olası bir okuma untrimmed bir dize veritabanı yapmak için iyi bir iş değil düzeltmek için veritabanı içine gönderilmesidir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • NYCarspotter

    NYCarspotter

    26 EYLÜL 2011
  • Visual Life

    Visual Life

    3 Temmuz 2006